package org.totoro.memory.oom;

/**
 * 每个 Java 线程都需要占用一定的内存空间，当 JVM 向底层操作系统请求创建一个新的 native 线程时，如果没有足够的资源分配就会报此类错误。
 * <p>
 * 原因分析
 * JVM 向 OS 请求创建 native 线程失败，就会抛出 Unableto createnewnativethread，常见的原因包括以下几类：
 * 1、线程数超过操作系统最大线程数 ulimit 限制；
 * 2、线程数超过 kernel.pid_max（只能重启）；
 * <p>
 * 3、native 内存不足；
 * 该问题发生的常见过程主要包括以下几步：
 * <p>
 * 1、JVM 内部的应用程序请求创建一个新的 Java 线程；
 * 2、JVM native 方法代理了该次请求，并向操作系统请求创建一个 native 线程；
 * 3、操作系统尝试创建一个新的 native 线程，并为其分配内存；
 * 4、如果操作系统的虚拟内存已耗尽，或是受到 32 位进程的地址空间限制，操作系统就会拒绝本次 native 内存分配
 * 5、JVM 将抛出 java.lang.OutOfMemoryError:Unableto createnewnativethread 错误。
 * <p>
 * 解决方案
 * 1、升级配置，为机器提供更多的内存；
 * 2、降低 Java Heap Space 大小；
 * 3、修复应用程序的线程泄漏问题；
 * 4、限制线程池大小；
 * 5、使用 -Xss 参数减少线程栈的大小
 * 6、调高 OS 层面的线程最大数：执行 ulimia-a 查看最大线程数限制，使用 ulimit-u xxx 调整最大线程数限制
 * ulimit -a .... 省略部分内容 ..... max user processes (-u) 16384
 * <p>
 *
 * @author daocr
 * @date 2020/3/2
 */
public class UnableToCreateNewNativeThread {


}
